<?php

class MemberModel extends Model{

	protected $_auto = array (
		array('password','md5',Model::MODEL_BOTH,'function') , 
		array('reg_time', NOW_TIME, self::MODEL_INSERT),
		array('reg_ip', 'get_client_ip', self::MODEL_INSERT, 'callback', 1),
		// array('update_time', NOW_TIME),
	);

	protected $_validate = array(

		//array(验证字段,验证规则,错误提示,验证条件,附加规则,验证时间)
		
		// 验证验证码
	    // array('verify','require','请输入验证码!'), // 是否输入验证码
	    // array('verify','checkVerify','验证码错误!',1,'callback'),  // 验证码是否正确   


	    // 验证账号
	    array('account', '3,30', '账号长度不合法', self::EXISTS_VALIDATE, 'length'), // 用户名长度不合法
		array('account', 'checkDenyMember', -2, self::EXISTS_VALIDATE, 'callback'), // 用户名禁止注册
	    array('account','','帐号名称已经存在！',0,'unique',1), // 账号是否存在    

		/* 验证邮箱 */
		array('email', 'email', '邮箱格式不正确', self::EXISTS_VALIDATE), // 邮箱格式不正确
		array('email', '1,32', '邮箱长度不合法', self::EXISTS_VALIDATE, 'length'), // 邮箱长度不合法
		array('email', 'checkDenyEmail', '邮箱禁止注册', self::EXISTS_VALIDATE, 'callback'), // 邮箱禁止注册
		array('email', '', '邮箱已经存在', self::EXISTS_VALIDATE, 'unique'), // 邮箱被占用

		/* 验证密码 */
		array('password', '6,30', '密码长度不合法', self::EXISTS_VALIDATE, 'length'), // 密码长度不合法
		array('repeat_password','password','确认密码不正确',0,'confirm'), // 验证确认密码是否和密码一致     
	
		/* 验证手机号码 */
		// array('phone', '//', -9, self::EXISTS_VALIDATE), //手机格式不正确 TODO:
		// array('phone', 'checkMobile', '手机格式不正确', self::EXISTS_VALIDATE, 'callback'),
		array('phone', 'checkDenyMobile', '该手机禁止注册', self::EXISTS_VALIDATE, 'callback'), //手机禁止注册
		array('phone', '', '手机号已被注册', self::EXISTS_VALIDATE, 'unique'), //手机号被占用
	);



	/**
	 * 注册一个新用户
	 * @param  string $username 用户名
	 * @param  string $password 用户密码
	 * @param  string $email    用户邮箱
	 * @param  string $mobile   用户手机号码
	 * @return integer          注册成功-用户信息，注册失败-错误编号
	 */
	public function register($data){
		/* 添加用户 */
		$save_data = $this->create($data);
		if($save_data){
			// p($save_data);exit;
			// 生成邮箱认证 key
			$save_data['check_key'] = md5($save_data['reg_ip'].$save_data['accout'].$save_data['email']);
			$uid = $this->add($save_data);
			if($uid){
				// 发送验证邮箱邮件
				$this->sendCheckEmail($save_data['check_key'],$save_data['email'],$save_data['name']);
			}
			return $uid ? $uid : 0; //0-未知错误，大于0-注册成功
		} else {
			return $this->getError(); //错误详情见自动验证注释
		}
	}

	/**
	 * 用户登录认证
	 * @param  string  $username 用户名
	 * @param  string  $password 用户密码
	 * @param  integer $type     用户名类型 （1-用户名，2-邮箱，3-手机，4-UID）
	 * @return integer           登录成功-用户ID，登录失败-错误编号
	 */
	public function login($data, $type = 1){
		$account  = $data['account'];
		$password = $data['password'];
		$verify   = $data['code'];
		$res = $this->checkVerify($verify);
		if(!$res) return -3;
		$map = array();
		$map['account'] = $data['account'];
		$map['email'] = $data['account'];
		$map['_logic'] = 'OR';
		/* 获取用户数据 */
		$user = $this->where($map)->find();
		// echo $this->getLastSql();
		// pe($user);
		if(is_array($user)){
			/* 判断是否被禁用 */
			if($user['status'] == -1){
				return -4;
			}
			/* 验证用户密码 */
			if(md5($password) == $user['password']){

				$this->updateLogin($user['id']); //更新用户登录信息
				/* 设置 session */
				unset($user['password']);
				session('user',$user);

				return $user['id']; //登录成功，返回用户ID
			} else {
				return -2; //密码错误
			}
		} else {
			return -1; // 用户不存在或被禁用
		}
	}

	/**
	 * 获取用户信息
	 * @param  string  $uid         用户ID或用户名
	 * @param  boolean $is_username 是否使用用户名查询
	 * @return array                用户信息
	 */
	public function info($uid , $type = 0){
		$map['id'] = $uid;
		$user_info = $this->where($map)->find();
		unset($user_info['password']);
		if($type){
			return $user_info;	
		}else{
			session('user',$user_info);
		}
		
	}


	/**
	 * 更新用户登录信息
	 * @param  integer $uid 用户ID
	 */
	protected function updateLogin($uid){
		$data = array(
			'id'              => $uid,
			'last_login_time' => NOW_TIME,
			'last_login_ip'   => get_client_ip(1),
		);
		$this->save($data);
	}

	/**
	 * 更新用户信息
	 * @param int $uid 用户id
	 * @param string $password 密码，用来验证
	 * @param array $data 修改的字段数组
	 * @return true 修改成功，false 修改失败
	 * @author huajie <banhuajie@163.com>
	 */
	public function updateUserFields($uid, $password, $data){
		if(empty($uid) || empty($password) || empty($data)){
			$this->error = '参数错误！';
			return false;
		}

		//更新前检查用户密码
		if(!$this->verifyUser($uid, $password)){
			$this->error = '验证出错：密码不正确！';
			return false;
		}

		//更新用户信息
		$data = $this->create($data);
		if($data){
			return $this->where(array('id'=>$uid))->save($data);
		}
		return false;
	}



	/**
	 * 检测用户信息
	 * @param  string  $field  用户名
	 * @param  integer $type   用户名类型 1-用户名，2-用户邮箱，3-用户电话
	 * @return integer         错误编号
	 */
	public function checkField($field, $type = 1){
		$data = array();
		switch ($type) {
			case 1:
				$data['username'] = $field;
				break;
			case 2:
				$data['email'] = $field;
				break;
			case 3:
				$data['mobile'] = $field;
				break;
			default:
				return 0; //参数错误
		}

		return $this->create($data) ? 1 : $this->getError();
	}

	/**
	 * 验证用户密码
	 * @param int $uid 用户id
	 * @param string $password_in 密码
	 * @return true 验证成功，false 验证失败
	 * @author huajie <banhuajie@163.com>
	 */
	protected function verifyUser($uid, $password_in){
		$password = $this->getFieldById($uid, 'password');
		if(think_ucenter_md5($password_in, UC_AUTH_KEY) === $password){
			return true;
		}
		return false;
	}

	/**
	 * 验证验证码
	 * @param  [type] $verify [description]
	 * @return [type]         [description]
	 */
	protected function checkVerify($verify){
		// echo $verify;
		// p($_SESSION);
		if( $verify == $_SESSION['login']){
			return true;
		}else{
			return false;
		}

	}

	protected function get_client_ip(){
		return get_client_ip();
	}

	/**
	 * 检测用户名是不是被禁止注册
	 * @param  string $username 用户名
	 * @return boolean          ture - 未禁用，false - 禁止注册
	 */
	protected function checkDenyMember($username){
		return true; //TODO: 暂不限制，下一个版本完善
	}

	/**
	 * 检测邮箱是不是被禁止注册
	 * @param  string $email 邮箱
	 * @return boolean       ture - 未禁用，false - 禁止注册
	 */
	protected function checkDenyEmail($email){
		return true; //TODO: 暂不限制，下一个版本完善
	}

	/**
	 * 检测手机是不是被禁止注册
	 * @param  string $mobile 手机
	 * @return boolean        ture - 未禁用，false - 禁止注册
	 */
	protected function checkDenyMobile($mobile){
		return true; //TODO: 暂不限制，下一个版本完善
	}

	/**
	 * 根据配置指定用户状态
	 * @return integer 用户状态
	 */
	protected function getStatus(){
		return true; //TODO: 暂不限制，下一个版本完善
	}

	/**
	 * 验证邮箱验证
	 * @param  [type] $key [description]
	 * @return [type]      [description]
	 */
	public function checkEmail($key){
		// 判断该key是否已经做过验证
		$map['check_key'] = $key;
		$user_info = $this->where($map)->find();
		if(empty($user_info)){
			return -1;
		}
		if($user_info['check_email'] != -1){
			return -2;
		}
		// 验证成功
		$res = $this->where($map)->setField('check_email',1);
		if($res){
			// 判断用户是否已经登录
			if(uid()){
				$this->info(uid());
			}else{
				unset($user_info['password']);
				session('user',$user_info);
			}
			return 1;
		}else{
			return -9;
		}
		return false;
	}

	/**
	 * 发送验证邮件
	 * @param  [type] $key   [description]
	 * @param  [type] $email [description]
	 * @param  [type] $name  [description]
	 * @return [type]        [description]
	 */
	public function sendCheckEmail($key,$email,$name){
        $mail_tpl_config = M('options')->where("option_name = 'member_email_active'")->getField('option_value');
        $value = json_decode($mail_tpl_config,1);
        // p($value);
        $link = SITE_DOMAIN.'/member/index/checkEmail/key/'.$key;
        $title = str_replace('#name#', $name, $value['title']);
        $message = str_replace('#link#', $link, $value['template']);
        $message = str_replace('#name#', $name, $message);
        $res = SendMail($email,$title,$message);
	}

}